﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;

namespace Systemet.Views
{
    public partial class Prognoskort : UserControl
    {
        private bool regPrognos;
        private bool regUpparbetat;
        private int user;
        private Domain.ProdukController prodController;
        private Technical.PrognosConnection pC;
        private Domain.PrognosController rc;
        private Domain.TextfileController tC;
        private List<TextfilPrognos> prognos;
        private List<Prognos> oldPrognoses;
        private int prognosedMonths;
        private int choosenMonth;
        private bool cellChanging = false;
        private string cellValue;
        private string currentAvd;
        int xCoordinate;
        int yCoordinate;

        public Prognoskort()
        {
            InitializeComponent();
            AccessController.Instance.MainView = this;

            regPrognos = AccessController.Instance.UserRoleLoggedInUser.PrognostiseringRegPrognos;
            regUpparbetat = AccessController.Instance.UserRoleLoggedInUser.PrognostiseringRegUpparbetat;
            user = (int)AccessController.Instance.LoggedInUser.RoleID;

            if (user == 1 || user == 4)
            {
                currentAvd = "";
            }
            if (user == 5)
            {
                currentAvd = "Drift";
            }
            if (user == 6)
            {
                currentAvd = "Förv";
            }

        }
        //ReadOnly Prognos
        public void ReadonlyPrognos(int UserAcess)
        {
            int NotReadOnlyKolumn = UserAcess;
            prognosDGV.Columns[UserAcess].ReadOnly = false;
           //ADMIN behörigheter
            if (user == 1)
            {
                for (int j = 0; j < prognosDGV.Rows.Count; j++)
                {
                    for (int i = 0; i < prognosDGV.Columns.Count; i++)
                    {
                        if (i != 5 && i != 8)
                        {
                            prognosDGV.Rows[j].Cells[i].ReadOnly = true;
                        }
                    }
                }
            }
            else
            {
                for (int j = 0; j < prognosDGV.Rows.Count; j++)
                {
                    for (int i = 0; i < prognosDGV.Columns.Count; i++)
                    {
                        if (i != NotReadOnlyKolumn)
                        {
                            prognosDGV.Rows[j].Cells[i].ReadOnly = true;
                        }
                    }
                }
            }
        }
        //Clearar
        public void clearDatagridView()
        {
            if (this.prognosDGV.DataSource != null)
            {
                this.prognosDGV.DataSource = null;
            }
            else
            {
                this.prognosDGV.Rows.Clear();
            }
            cellValue = null;
        }


        //Uppdaterar DGV 
        public void UpdateDGV(List<Prognos> prognoses)
        {
            prognosDGV.DataSource = prognoses;
            HideNSetColumnsInDGV();
        }
        //Importerar textfil
        private void btnImportTxtfil_Click(object sender, EventArgs e)
        {
            Domain.TextfileController tC = new Domain.TextfileController();
            tC.readFile(choosenMonth);
            cbMonth_SelectedIndexChanged(null, null);
        }

        //Metoden som lägger till Columner för prognos fönstret även beräkningar sker här.
        private void HideNSetColumnsInDGV()
        {
            prognosDGV.Columns["Signatur"].Visible = false;
            prognosDGV.Columns["PrognosID"].Visible = false;
            prognosDGV.Columns["ProduktID"].Visible = false;
            prognosDGV.Columns["Uppföljning"].Visible = false;
            prognosDGV.Columns["Datum"].Visible = false;
            prognosDGV.Columns["Låst"].Visible = false;
            prognosDGV.Columns["ÄndratDatum"].Visible = false;
            prognosDGV.Columns["AvserDatum"].Visible = false;
            prognosDGV.Columns["prognos"].HeaderText = "Prognos";
            prognosDGV.Columns["PrognosMinusBudget"].HeaderText = "Prognos-Budget";
            SetValues();
        }
        //Sätter värden till DGV
        private void SetValues()
        {
            rc = new Domain.PrognosController();
            oldPrognoses = new List<Prognos>();
            oldPrognoses = rc.RetrieveEarlierPrognoses(choosenMonth);

            foreach (DataGridViewRow dR in prognosDGV.Rows)
            {
               foreach (DataGridViewColumn dgvC in prognosDGV.Columns)
                {
                    if (dgvC.Name == "UtfallAcc")
                    {
                       int UtfallAcc = FilterprognosValueUtfallAcc(dR.Cells["ProduktID"].Value.ToString(), choosenMonth);
                       int utfall = int.Parse(dR.Cells["Utfallmånad"].Value.ToString());
                       int upparbetat = int.Parse(dR.Cells["Upparbetat"].Value.ToString());
                       int trend = (utfall + upparbetat) / choosenMonth * 12;
                       int oldprognos = FilterprognosValueOldPrognos(dR.Cells["ProduktID"].Value.ToString(), choosenMonth);
                       int prognos = 0;
                        if (dR.Cells["prognos"].Value != null)
                       {
                            prognos = int.Parse(dR.Cells["prognos"].Value.ToString());
                       }
                       int budget = int.Parse(dR.Cells["Budget"].Value.ToString());
                       dR.Cells["UtfallAcc"].Value = (UtfallAcc + utfall).ToString();
                       dR.Cells["Trend"].Value = trend.ToString();
                       dR.Cells["Föregåendeprognos"].Value = oldprognos.ToString();
                       dR.Cells["PrognosMinusBudget"].Value = (prognos - budget).ToString();
                    }
                
                }
            
            
             }


        }

        private int FilterprognosValueUtfallAcc(string prodID, int month)
        {
            int utfallacc = 0;
            foreach (Prognos p in oldPrognoses)
            {
                if (p.ProduktID == prodID && p.Datum.Month < month)
                {
                    utfallacc += (int)p.Utfallmånad;
                }

            }
            return utfallacc;
        }
        //Filtrerar
        private int FilterprognosValueOldPrognos(string prodID, int month)
        {
            int oldprognos = 0;
            foreach (Prognos p in oldPrognoses)
            {
                if (p.ProduktID == prodID && p.Datum.Month == month-1)
                {
                    oldprognos = (int)p.prognos;
                }
              
            }
            return oldprognos;
        }

        public void Prognoskort_Load(object sender, EventArgs e)
        {
            rc = new Domain.PrognosController();
            // rc.CreatemonthlyPrognoses();
            cmBArsFIlter.Items.AddRange(rc.GetAllBudgetedYears().ToArray());
            cmBArsFIlter.SelectedIndex = cmBArsFIlter.Items.Count -1;
        }
        //Filtrerar på år
        private void cmBArsFIlter_SelectedIndexChanged(object sender, EventArgs e)
        {
            clearDatagridView();
            int number;
            if (int.TryParse(cmBArsFIlter.Text, out number))
            {
                prognosedMonths = rc.GetValidatedPrognoses(number);
            }
        }


        //Väljer månad
        private void cbMonth_SelectedIndexChanged(object sender, EventArgs e) 
        {
            clearDatagridView();
            rc = new Domain.PrognosController();
            int number;
            if (int.TryParse(cmBArsFIlter.Text, out number))
            {
                prognosedMonths = rc.GetValidatedPrognoses(number);
            }
            
            int månad = cbMonth.SelectedIndex + 1;
            choosenMonth = månad;

            if (månad == 1 && prognosedMonths == 0) //Nytt kalenderår
            {
                btnImportTxtfil.Enabled = regUpparbetat;
            }

            else if (månad == prognosedMonths)
            {
                UpdateDGV(rc.GetPrognos(månad, currentAvd, "","",""));
                btnImportTxtfil.Enabled = false;
                    if (!rc.ValidatePrognosesLocked(choosenMonth +1))
                    {
                        btnLasbudg.Enabled = regPrognos;
                        if (regUpparbetat)
                        {
                            ReadonlyPrognos(5);
                        }
                        if (regPrognos)
                        {
                            ReadonlyPrognos(8);
                        }
                    }
                    if (rc.ValidatePrognosesLocked(choosenMonth + 1))
                    {
                       
                        if (regUpparbetat)
                        {
                            ReadonlyPrognos(10);
                        }
                        if (regPrognos)
                        {
                            ReadonlyPrognos(10);
                        }
                    }
                

            }

            else if (månad == prognosedMonths + 1 && rc.ValidatePrognosesLocked(choosenMonth))
            {
                SetImportButton(); // TIllåter inläsning av ny månad
            }
            else if (månad >= prognosedMonths || !rc.ValidatePrognosesLocked(choosenMonth))
            {
                MessageBox.Show("Du måste göra prognostisering för föregående månad först");
                btnImportTxtfil.Enabled = false;
                btnLasbudg.Enabled = false;
            }
            else if (månad <= prognosedMonths && rc.ValidatePrognosesLocked(choosenMonth))
            {
                UpdateDGV(rc.GetPrognos(månad, currentAvd, "", "",""));
                btnImportTxtfil.Enabled = false;
                btnLasbudg.Enabled = false;
                prognosDGV.ReadOnly = true;
            }

        }

        private bool SetImportButton()
        {
            if (rc.ValidatePrognosesLocked(choosenMonth))
            {
                btnImportTxtfil.Enabled = regUpparbetat;
                return true;
            }
            return false;
        }

        //Changed event
        private void prognosDGV_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if(cellValue != null)
            {
                if (cellChanging)
                {

                    cellChanging = false;
                    string nyAllokering = prognosDGV.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
                    string columnName = prognosDGV.Columns[e.ColumnIndex].Name.ToString();
                    string prodID = prognosDGV.Rows[e.RowIndex].Cells[0].Value.ToString();
                    int row = e.RowIndex;
                    int kolumn = e.ColumnIndex;
                    if (cellValue != nyAllokering)
                    {
                        //Drift/Utv Chef
                        if (columnName == "Upparbetat")
                        {
                            int number;
                            if (int.TryParse(nyAllokering, out number))
                            {
                                rc = new Domain.PrognosController();
                                rc.InsertUpparbetatValue(prodID, choosenMonth, number);
                                cbMonth_SelectedIndexChanged(null, null);
                            }
                            else
                            {
                                prognosDGV.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = 0;
                                MessageBox.Show("Endast siffror");
                            }

                        }
                        //Marknadschef
                        if (columnName == "prognos")
                        {
                            int number;
                            if (int.TryParse(nyAllokering, out number))
                            {
                                rc = new Domain.PrognosController();
                                rc.InsertPrognosValue(prodID, choosenMonth, number);
                                cbMonth_SelectedIndexChanged(null, null);
                            }
                            else
                            {
                                prognosDGV.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = 0;
                                MessageBox.Show("Endast siffror");
                            }
                        }
                    }
                }
            }
        }

        //Ändrar i gridview
        private void prognosDGV_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            if (prognosDGV.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == null)
            {
                cellValue = "";
            }
            else
            {
                cellValue = prognosDGV.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
            }
            cellChanging = true;
        }
        //Låser
        private void btnLasbudg_Click(object sender, EventArgs e)
        {
            List<Prognos> unPrognosed = new List<Prognos>();
            rc = new Domain.PrognosController();
            unPrognosed = rc.ValidateIfPrognosesIsOn(choosenMonth);

            if (unPrognosed.Count > 0)
            {
                if (AccessController.Instance.UserRoleLoggedInUser.PrognostiseringLåsPrognos)
                {

                    List<string> temp = new List<string>();
                    temp.Add("Följande Produkter måste det sättas en Prognos för först");
                    foreach (Prognos p in unPrognosed)
                    {
                        temp.Add("ID: " + p.ProduktID + " Produktnamn: " + p.Produkt);
                    }

                    var message = string.Join(Environment.NewLine, temp.ToArray());

                    DialogResult dialogResult = MessageBox.Show(message, "Ej fastställda Prognoser", MessageBoxButtons.OK);
                    if (dialogResult == DialogResult.OK)
                    {

                    }
                }

            }
            else
            {
                DialogResult dialogResult = MessageBox.Show("Alla produkter har allokerats en prognos, vill du låsa denna månad?", "Låsning av Prognostiserad produkter", MessageBoxButtons.YesNo);
                if (dialogResult == DialogResult.Yes)
                {
                    bool IsSuccess = rc.LockPrognoses(choosenMonth);
                    if (IsSuccess)
                    {
                        MessageBox.Show("Månaden har låsts");
                        btnLasbudg.Enabled = false;
                    }
                    else
                    {
                        MessageBox.Show("Det uppstod ett fel vid låsning");
                    }
                }
            }
        }


        //Filter på produkter från sidvy (Genom controller och Endast om man valt en månad)
        public void filterPrognoses(string avd, string prodkategori, string prodgrupp, string prodNamn)
        {
            if (cbMonth.SelectedIndex >= 0)
            {
                rc = new Domain.PrognosController();
                UpdateDGV(rc.GetPrognos(cbMonth.SelectedIndex + 1, avd, prodkategori, prodgrupp, prodNamn));
            }
        }


    }
}
